package com.vipboot.framework.mybatisplus.core.base.dao;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.toolkit.Db;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.vipboot.framework.core.util.MapStructUtil;
import com.vipboot.framework.mybatisplus.core.base.mapper.PlusBaseMapper;


import java.util.Collection;
import java.util.List;

/**
 * 建议开发中以此为数据基本操作类，而不是以*Mapper为基础操作类，
 * 如果需要使用*Mapper中的方法，可以直接通过getMapper()取得Entity对应的*Mapper类，此类与*Mapper类相比做了很多的增强功能，
 *
 * @param <M>
 * @param <T>
 */
public class PlusDaoImpl<M extends PlusBaseMapper<T>, T> extends MPJBaseServiceImpl<M, T> {

    public <C, P extends IPage<C>> P pageVo(IPage<T> page, Wrapper<T> queryWrapper, Class<C> asType) {
        IPage<T> entityPage = this.page(page, queryWrapper);
        // 创建一个新的VO对象分页列表，并设置分页信息
        IPage<C> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
        if (CollUtil.isEmpty(entityPage.getRecords())) {
            return (P) voPage;
        }
        voPage.setRecords(MapStructUtil.convert(entityPage.getRecords(), asType));
        return (P) voPage;
    }


    /**
     * 根据条件查询实体对象列表，并将其转换为指定的VO对象列表
     *
     * @param wrapper 查询条件Wrapper
     * @param asType  要转换的VO类的Class对象
     * @param <C>     VO类的类型
     * @return 查询到的VO对象列表，经过转换为指定的VO类后返回
     */
    public <C> List<C> listVo(Wrapper<T> wrapper, Class<C> asType) {
        List<T> list = this.list(wrapper);
        if (CollUtil.isEmpty(list)) {
            return CollUtil.newArrayList();
        }
        return MapStructUtil.convert(list, asType);
    }
}
